package me.chanjar.tomcat.valves;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import org.apache.juli.logging.Log;
import org.apache.tomcat.util.res.StringManager;
import org.apache.tomcat.util.ExceptionUtils;
import com.mongodb.BasicDBObject;
import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
public class CollectionFactory {
public static DBCollection getOrCreateCollection(
String uri, String dbName, String collName, boolean capped, int capSize, Log log, StringManager sm) {
MongoClient mongoClient = null;
DB db = null;
try {
mongoClient = new MongoClient(new MongoClientURI(uri));
db = mongoClient.getDB(dbName);
} catch (UnknownHostException ex) {
log.error(sm.getString("mongoAccessLogValve.openConnectionError", uri), ex);
throw new RuntimeException(ex);
}
DBCollection coll = null;
try {
if (capped) {
DBObject options = new BasicDBObject();
options.put("capped", true);
options.put("size", capSize * 1024 * 1024);
coll = db.createCollection(collName, options);
for(DBObject indexOption : getIndexOptions()) {
coll.createIndex(indexOption);
}
} else {
coll = db.getCollection(collName);
}
} catch (com.mongodb.CommandFailureException ex) {
String errmsg = (String) ex.getCommandResult().get("errmsg");
if ("collection already exists".equals(errmsg)) {
log.info(sm.getString("mongoAccessLogValve.collectionExisted", collName));
coll = db.getCollection(collName);
}
ExceptionUtils.handleThrowable(ex);
} catch (Exception ex) {
log.error(sm.getString(
"mongoAccessLogValve.openConnectionError", uri), ex);
}
return coll;
}
protected static List<DBObject> getIndexOptions() {
List<DBObject> options = new ArrayList<DBObject>();
options.add(BasicDBObjectBuilder.start().add("sessionId", 1).get());
options.add(BasicDBObjectBuilder.start().add("datetime", -1).get());
options.add(BasicDBObjectBuilder.start().add("user", 1).get());
options.add(BasicDBObjectBuilder.start().add("statusCode", 1).get());
options.add(BasicDBObjectBuilder.start().add("elapsedSeconds", 1).get());
options.add(BasicDBObjectBuilder.start().add("elapsedMilliseconds", 1).get());
options.add(BasicDBObjectBuilder.start().add("bytesSent", 1).get());
options.add(BasicDBObjectBuilder.start().add("url", 1).get());
options.add(BasicDBObjectBuilder.start().add("method", 1).get());
options.add(BasicDBObjectBuilder.start().add("url", 1).add("datetime", -1).get());
options.add(BasicDBObjectBuilder.start().add("user", 1).add("statusCode", 1).get());
options.add(BasicDBObjectBuilder.start().add("user", 1).add("datetime", -1).get());
options.add(BasicDBObjectBuilder.start().add("user", 1).add("sessionId", 1).add("statusCode", 1).add("datetime", -1).get());
options.add(BasicDBObjectBuilder.start().add("user", 1).add("sessionId", 1).add("url", 1).add("statusCode", 1).add("datetime", -1).get());
options.add(BasicDBObjectBuilder.start().add("sessionId", 1).add("datetime", -1).get());
options.add(BasicDBObjectBuilder.start().add("sessionId", 1).add("statusCode", 1).get());
options.add(BasicDBObjectBuilder.start().add("sessionId", 1).add("statusCode", 1).add("datetime", -1).get());
options.add(BasicDBObjectBuilder.start().add("sessionId", 1).add("url", 1).add("statusCode", 1).add("datetime", -1).get());
return options;
}
}